/*!
 * \file WtDistExecuter.cpp
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 分布式执行器实现文件
 * 
 * 本文件实现了分布式执行器的核心功能，主要包括：
 * 1. 分布式持仓目标的管理和同步
 * 2. 持仓变动的广播机制
 * 3. 多节点间的协调和通信
 * 4. 负载均衡和容错处理
 * 
 * 分布式执行器主要用于大规模交易系统中，通过多个节点
 * 协同工作来提高系统的处理能力和可靠性。
 */
#include "WtDistExecuter.h"

#include "../Includes/WTSVariant.hpp"

#include "../Share/decimal.h"
#include "../WTSTools/WTSLogger.h"

USING_NS_WTP;

/**
 * @brief 构造函数
 * @param name 执行器名称
 * 
 * 初始化分布式执行器的基本属性
 */
WtDistExecuter::WtDistExecuter(const char* name)
	: IExecCommand(name)
{

}

/**
 * @brief 析构函数
 * 
 * 清理分布式执行器资源
 */
WtDistExecuter::~WtDistExecuter()
{

}

/**
 * @brief 初始化执行器
 * @param params 配置参数
 * @return 是否初始化成功
 * 
 * 根据配置参数初始化分布式执行器，设置缩放比例等参数
 */
bool WtDistExecuter::init(WTSVariant* params)
{
	if (params == NULL)
		return false;

	_config = params;
	_config->retain();

	_scale = params->getUInt32("scale");

	return true;
}

/**
 * @brief 设置目标持仓
 * @param targets 目标持仓映射表
 * 
 * 设置各个合约的目标持仓，应用缩放比例后广播到分布式节点
 */
void WtDistExecuter::set_position(const faster_hashmap<LongKey, double>& targets)
{
	for (auto it = targets.begin(); it != targets.end(); it++)
	{
		const char* stdCode = it->first.c_str();
		double newVol = it->second;

		newVol *= _scale;
		double oldVol = _target_pos[stdCode];
		_target_pos[stdCode] = newVol;
		if (!decimal::eq(oldVol, newVol))
		{
			WTSLogger::log_dyn_f("executer", _name.c_str(), LL_INFO, "[{}]{}目标持仓变化: {} -> {}", _name.c_str(), stdCode, oldVol, newVol);
		}

		// TODO: 广播目标持仓到分布式节点
	}
}

/**
 * @brief 合约持仓变动回调
 * @param stdCode 标准合约代码
 * @param targetPos 目标持仓
 * 
 * 当某个合约的目标持仓发生变化时，应用缩放比例后广播到分布式节点
 */
void WtDistExecuter::on_position_changed(const char* stdCode, double targetPos)
{
	targetPos *= _scale;

	double oldVol = _target_pos[stdCode];
	_target_pos[stdCode] = targetPos;

	if (!decimal::eq(oldVol, targetPos))
	{
		WTSLogger::log_dyn_f("executer", _name.c_str(), LL_INFO, "[{}]{}目标持仓变化: {} -> {}", _name.c_str(), stdCode, oldVol, targetPos);
	}

	// TODO: 广播目标持仓到分布式节点
}

/**
 * @brief 实时行情回调
 * @param stdCode 标准合约代码
 * @param newTick 新的Tick数据
 * 
 * 分布式执行器通常不需要处理ontick事件，
 * 实际的行情处理由各个分布式节点完成
 */
void WtDistExecuter::on_tick(const char* stdCode, WTSTickData* newTick)
{
	// 分布式执行器不需要处理ontick事件
}
